package edu.tfh.s2.ehkbot.steuerung.schnittstellen;

import edu.tfh.s2.ehkbot.daten.InitFactory;

/**
 * Netzwerk bildet die Schnittstelle zu Ausßenwelt ab
 * 
 * @author s2zehn
 */
public class Netzwerk {
	/**
	 * Das State Interface für Netzwerk.
	 */
	public interface NetzwerkState extends Cloneable {
		/**
		 * @see java.lang.Object#clone()
		 */
		public Object clone();

		/**
		 * Liefert die Nachricht ab die an post anliegt.
		 * 
		 * @param port
		 *            Der Port.
		 * @return Die Nachricht.
		 */
		public byte[] getNachricht(String port);

		/**
		 * Prüft ob eine Nachricht da ist.
		 * 
		 * @param port
		 *            Der Port der gepfüft werden soll.
		 * @return true fals eine Nachricht vorliegt.
		 */
		public boolean isNachrichtDa(String port);

		/**
		 * Sendet eine Nachticht an den Port.
		 * 
		 * @param nachricht
		 *            Die Nachricht.
		 * @param port
		 *            Der Port.
		 */
		public void sendeNachricht(byte[] nachricht, String port);
	}

	private static Netzwerk instance = null;

	/**
	 * Singelton Methode.
	 * 
	 * @return Die einzige Instanz von Netzwerk.
	 */
	public static Netzwerk getInstance() {
		if (instance == null) {
			instance = new Netzwerk(InitFactory.getInstance().getNetzwerk());
		}
		return instance;
	}

	private NetzwerkState state;

	/**
	 * Liefert die Nachricht ab die an post anliegt.
	 * 
	 * @param port
	 *            Der Port.
	 * @return Die Nachricht.
	 */
	private Netzwerk(NetzwerkState state) {
		this.state = state;
	}

	/**
	 * @param port
	 * @return
	 */
	public byte[] getNachricht(String port) {
		return state.getNachricht(port);
	}

	/**
	 * Prüft ob eine Nachricht da ist.
	 * 
	 * @param port
	 *            Der Port der gepfüft werden soll.
	 * @return true fals eine Nachricht vorliegt.
	 */
	public boolean isNachrichtDa(String port) {
		return state.isNachrichtDa(port);
	}

	/**
	 * Sendet eine Nachticht an den Port.
	 * 
	 * @param nachricht
	 *            Die Nachricht.
	 * @param port
	 *            Der Port.
	 */
	public void sendeNachricht(byte[] nachricht, String port) {
		state.sendeNachricht(nachricht, port);
	}
}